package bd;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;

import bd.excecoes.XMLException;

/**
 * Classe que cria um XML, a partir do caminho especificado.
 * 
 * @author Jonathan Brilhante
 * @author Jose Rafael
 * @author Nata Venancio
 * @author Renato Almeida
 * 
 * @version 1.0
 */

public class CriaXML {
	private DocumentBuilderFactory dbf;
	private DocumentBuilder builder;
	private DOMImplementation impl;
	private Document doc;
	private String raiz, path;

	/**
	 * Cria um CriaXML, a partir da raiz e do caminho para criar
	 * 
	 * @param raiz
	 *            a raiz
	 * @param path
	 *            o caminho para criacao
	 */
	public CriaXML(String raiz, String path) {
		this.raiz = raiz;
		this.path = path;
	}

	/**
	 * Metodo que cria um documento XML usando a estrutura DOM. Nesse documento
	 * serao armazenados os dados dos usuarios.
	 * 
	 * Passa a raiz do documento como parametro.
	 */
	private void criaDoc() {
		dbf = DocumentBuilderFactory.newInstance();
		try {
			builder = dbf.newDocumentBuilder();
		} catch (ParserConfigurationException erro) {
			throw new XMLException("Erro ao criar DocumentBuilder!");
		}
		impl = builder.getDOMImplementation();
		doc = impl.createDocument(null, "bancoUsuarios", null);
		doc.setStrictErrorChecking(true);
		DOMSource source = new DOMSource(doc);

		StreamResult result = null;
		try {
			FileOutputStream fileStream = new FileOutputStream(path);
			result = new StreamResult(fileStream);
		} catch (FileNotFoundException erro) {
			throw new XMLException("Problema na criacao do arquivo");
		}
		TransformerFactory tf = TransformerFactory.newInstance();
		Transformer serializer = null;
		try {
			serializer = tf.newTransformer();
		} catch (TransformerConfigurationException erro) {
			throw new XMLException("Problema na serializacao do arquivo");
		}
		serializer.setOutputProperty(OutputKeys.INDENT, "yes");
		try {
			serializer.transform(source, result);
		} catch (TransformerException erro) {
			throw new XMLException("Problema na copia do arquivo");
		}
	}

	/**
	 * Retorna o doc criado
	 * 
	 * @return Document
	 */
	public Document getDoc() {
		this.criaDoc();
		return doc;
	}

	/**
	 * Retorna a raiz
	 * 
	 * @return a raiz
	 */
	public String getRaiz() {
		return raiz;
	}
}